4 kyu
傳入兩個參數,input 為字串、markers 為陣列形式;
按照陣列裡的字元符號,移除 input 同樣符號與它後面的字元、行尾的空白,最後輸出結果。
例如:
apples, pears # and bananas
grapes
bananas !apples
移除 # ! 之後的字元
apples, pears
grapes
bananas
利用 filter 過濾字元,判斷 markers 裡的符號要移除、\n 要保留。
loop 跑迴圈,如果迭代的字元可在 markers 找到。
刪除模式,將這次開始的每一個元素都移除;直到找到 \n,開始保留模式,將每個元素保留。
input.split("").filter(item=>{
let isClear = false <-- 紀錄是否要保留
if(markers.includes(item)) isClear = true
if(item === \n) isClear = false
if(isClear) return false
if(!isClear) return true
})
function solution(input, markers) {
let isClear = false;
let workArr = input.split("\n");
for (let i = 0; i < workArr.length; i++) {
isClear = false;
workArr[i] = workArr[i].split("").filter((item) => {
if (markers.includes(item)) isClear = true;
if (item === "\n") isClear = false;
return !isClear;
}).join("").trim();
}
return workArr.join("\n");
};
isClear 用來記錄目前是刪除還是保留狀態;
workArr 將 input 參數以換行符號為界線切割成陣列,並且進入 for 迴圈。
在迴圈中,isClear 會被重新 = false,避免上一輪的變化影響。
workArr 再拆解成單一字元,並且用 filter 過濾;markers.includes(item)
判斷如果能在 markers 找到,表示必須開始由此清除,isClear 將被改為 = true;如果是換行符號,表示由此開始要保留;isClear = false。
filter 會把條件判斷為 true 的元素留下、false 則移除;因此直接返回 !isClear。
最後把單一字元陣列轉為字串後,再去掉頭尾的空格;再把一元陣列轉為字串,用換行符號拼接即可。
其實最一開始解這題目用了兩層 for 迴圈⋯⋯
不過在演算法中這時間複雜度太差,還是重新想了一次。